/**
 * Vue组件模板属性验证工具
 * 用于检查模板中使用的属性是否在组件实例上定义
 */

/**
 * 验证Vue组件实例上是否存在指定的属性
 * @param {Object} vm - Vue组件实例
 * @param {Array<string>} propNames - 需要检查的属性名数组
 * @returns {Object} 验证结果，包含missing数组和valid布尔值
 */
export function validateTemplateProps(vm, propNames) {
    if (!vm || !propNames || !Array.isArray(propNames)) {
        return { valid: false, missing: [], error: '参数无效' };
    }

    const missing = [];

    // 检查每个属性是否在实例上定义
    propNames.forEach(prop => {
        // 拆分复杂属性路径 (如 'user.name')
        const parts = prop.split('.');
        const rootProp = parts[0];

        // 检查data、computed、methods、props中是否存在该属性
        const exists =
            // 检查data中的响应式属性
            (typeof vm[rootProp] !== 'undefined') ||
            // 检查computed
            (vm.$options.computed && typeof vm.$options.computed[rootProp] !== 'undefined') ||
            // 检查methods
            (vm.$options.methods && typeof vm.$options.methods[rootProp] !== 'undefined') ||
            // 检查props
            (vm.$options.props && typeof vm.$options.props[rootProp] !== 'undefined') ||
            // 检查全局属性
            (typeof vm.$root[rootProp] !== 'undefined');

        if (!exists) {
            missing.push(prop);
        }
    });

    return {
        valid: missing.length === 0,
        missing
    };
}

/**
 * 在Vue实例创建后自动验证常用的模板属性
 * @param {Object} vm - Vue组件实例
 * @param {Array<string>} additionalProps - 额外需要检查的属性
 * @param {Boolean} strict - 是否严格模式，如果为true，会立即尝试修复问题
 */
export function autoValidateTemplateProps(vm, additionalProps = [], strict = false) {
    try {
        // 从模板中提取可能使用的属性
        // 注意：这是一个简化的实现，实际上需要解析模板
        const template = vm.$options.template || '';
        const renderedTemplate = vm.$el ? vm.$el.outerHTML : '';

        // 简单匹配 {{ prop }} 或 v-model="prop" 等模式
        const propsRegex = /{{([^}]+)}}|v-model="([^"]+)"|v-if="([^"]+)"|v-show="([^"]+)"|v-for="[^"]*in ([^"]+)"|:([^=]+)="([^"]+)"/g;
        const matches = [...(template + renderedTemplate).matchAll(propsRegex)];

        const usedProps = new Set();

        matches.forEach(match => {
            // 提取属性名
            for (let i = 1; i < match.length; i++) {
                if (match[i]) {
                    // 处理复杂表达式，只取第一个标识符
                    const props = match[i].trim().split(/[\s.()[]+/);
                    if (props[0] && !['true', 'false', 'null', 'undefined'].includes(props[0])) {
                        usedProps.add(props[0]);
                    }
                }
            }
        });

        // 添加额外需要检查的属性
        additionalProps.forEach(prop => usedProps.add(prop));

        // 执行验证
        const result = validateTemplateProps(vm, Array.from(usedProps));

        // 如果有未定义的属性，在开发环境下发出警告
        if (!result.valid && process.env.NODE_ENV !== 'production') {
            console.warn(
                `[Vue Template Validator] 组件 ${vm.$options.name || 'Unknown'} 中有未定义的属性: ${result.missing.join(', ')}`
            );

            // 如果启用严格模式，尝试修复问题
            if (strict && result.missing.length > 0) {
                result.missing.forEach(prop => {
                    // 添加临时属性以避免错误
                    console.info(`[Vue Template Validator] 添加临时属性: ${prop}`);
                    vm.$set(vm, prop, null);
                });
            }
        }

        return result;
    } catch (error) {
        console.error('[Vue Template Validator] 验证过程出错:', error);
        return { valid: false, error: error.message };
    }
}

/**
 * 创建Vue项目常用的属性集合
 * @param {Object} data - 数据对象
 * @returns {Object} 处理后的数据对象
 */
export function createDefaults(data = {}) {
    // 常用的响应式属性默认值
    const defaults = {
        loading: false,
        error: null,
        success: false,
        // 添加其他常用默认值
    };

    return { ...defaults, ...data };
}

export default {
    validateTemplateProps,
    autoValidateTemplateProps,
    createDefaults
}; 